在 JS 中,所謂的內建物件(Built-in Objects)其實是一系列的內建函式,它們每個都可以被當成建構子(Constructor)使用(也就是可以通過 new 呼叫的函式),並創造出一個相應的新物件(而非基本類型值)。
var strPrimitive = "I am a string";
typeof strPrimitive; // "string"
strPrimitive instanceof String; // false
var strObject = new String( "I am a string" );
typeof strObject; // "object"
strObject instanceof String; // true
Object.prototype.toString.call( strObject ); // [object String]
從以上程式碼中可以看到,strObject 屬於內建物件 String 的實例,但是 strPrimitive 的內容是字串,是一個字串純值。如果對 strObject 調用 toString,可以得知它是一個字串物件(Strings Object)。
在一些必要的情況下,比方說調用 length 檢查某個字串的長度,就需要使用 String 物件包裝原本的字串,才能訪問 String 物件的 length 屬性。
這時 JS 會自動將基本型別 string 強制轉換為內建物件 String ,因此在 JS 當中,幾乎不需要手動創建基本型別的內建物件。
var strPrimitive = "I am a string";
console.log( strPrimitive.length ); // 13
console.log( strPrimitive.charAt( 3 ) ); // "m"
其他例子像是:一個數字 42 包裝成物件會是 new Number(42),而一個布林值 true 的包裝物件則是 new Boolean(true)。
這些基本型別需要使用內建屬性與方法時,JS 會自動調用 new 建立對應型別的內建物件,並使用這些物件裡的屬性與方法。
null 和 undefinednull 和 undefined 僅有基本型別值,它們沒有屬於自己的物件包裹器。
某些型別,如 Date 僅能以使用 new 的構造形式創建,因為它沒有對應的字面值(literal)形式。
另外,Error 物件很少被手動建立,它通常在程式拋出錯誤時自動被創建。
以下僅列出常見或常用類型,其餘內建物件可參考 MDN 連結。
String
Number
Boolean
Object
Function
Array
Date
RegExp
Error
Map (ES6+)Set (ES6+)